



<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>Asking for permission instead of forgiveness &mdash; Python Anti-Patterns  documentation</title>
  

  
  

  

  
  
    

  

  
  
    <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
  

  
    <link rel="stylesheet" href="../_static/css/ribbon.css" type="text/css" />
  
    <link rel="stylesheet" href="../_static/css/font-awesome-4.1.0/css/font-awesome.min.css" type="text/css" />
  
    <link rel="stylesheet" href="../_static/css/menu.css" type="text/css" />
  
        <link rel="index" title="Index"
              href="../genindex.html"/>
        <link rel="search" title="Search" href="../search.html"/>
    <link rel="top" title="Python Anti-Patterns  documentation" href="../index.html"/>
        <link rel="up" title="Readability" href="index.html"/>
        <link rel="next" title="Comparing things to None the wrong way" href="comparison_to_none.html"/>
        <link rel="prev" title="Readability" href="index.html"/> 

</head>

<body class="wy-body-for-nav" role="document">

  <div class="wy-grid-for-nav">

    
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        <a href="../index.html"> Python Anti-Patterns</a>
        <div role="search">
  <form id ="rtd-search-form" class="wy-form" action="../search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>
      </div>


      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        
        
            <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../correctness/index.html"><i class="fa fa-check"></i> Correctness</a></li>
<li class="toctree-l1"><a class="reference internal" href="../maintainability/index.html"><i class="fa fa-puzzle-piece"></i> Maintainability</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html"><i class="fa fa-eye"></i> Readability</a><ul class="current">
<li class="toctree-l2 current"><a class="current reference internal" href="#">Asking for permission instead of forgiveness</a></li>
<li class="toctree-l2"><a class="reference internal" href="comparison_to_none.html">Comparing things to <cite>None</cite> the wrong way</a></li>
<li class="toctree-l2"><a class="reference internal" href="comparison_to_true.html">Comparing things to <cite>True</cite> the wrong way</a></li>
<li class="toctree-l2"><a class="reference internal" href="do_not_compare_types_use_isinstance.html">Using <cite>type()</cite> to compare types</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_a_dict_comprehension.html">Not using dict comprehensions</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_dict_keys_when_formatting_strings.html">Not using dict keys when formatting strings</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_items_to_iterate_over_a_dictionary.html">Not using <code class="docutils literal notranslate"><span class="pre">items()</span></code> to iterate over a dictionary</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_named_tuples_when_returning_more_than_one_value.html">Not using named tuples when returning more than one value from a function</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_unpacking_for_updating_multiple_values_at_once.html">Not using unpacking for updating multiple values at once</a></li>
<li class="toctree-l2"><a class="reference internal" href="not_using_zip_to_iterate_over_a_pair_of_lists.html">Not using <code class="docutils literal notranslate"><span class="pre">zip()</span></code> to iterate over a pair of lists</a></li>
<li class="toctree-l2"><a class="reference internal" href="putting_type_information_in_a_variable_name.html">Putting type information in a variable name</a></li>
<li class="toctree-l2"><a class="reference internal" href="test_for_object_identity_should_be_is_not.html">Test for object identity should be <code class="docutils literal notranslate"><span class="pre">is</span></code></a></li>
<li class="toctree-l2"><a class="reference internal" href="using_an_unpythonic_loop.html">Using an unpythonic loop</a></li>
<li class="toctree-l2"><a class="reference internal" href="using_map_or_filter_where_list_comprehension_is_possible.html">Using <code class="docutils literal notranslate"><span class="pre">map()</span></code> or <code class="docutils literal notranslate"><span class="pre">filter()</span></code> where list comprehension is possible</a></li>
<li class="toctree-l2"><a class="reference internal" href="using_camelcase_in_function_names.html">Using <cite>CamelCase</cite> in function names</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../security/index.html"><i class="fa fa-lock"></i> Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="../performance/index.html"><i class="fa fa-dashboard"></i> Performance</a></li>
<li class="toctree-l1"><a class="reference internal" href="../django/index.html"><i class="fa fa-book"></i> Django</a></li>
</ul>

        
      </div>
      &nbsp;

    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="../index.html">Python Anti-Patterns</a>
      </nav>


      
      <div class="wy-nav-content" id="signup-box" >
        <div class="rst-content">
          <div class="navigation" role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
    <li><a href="../index.html">Documentation</a> &raquo;</li>
      
          <li><a href="index.html"><i class="fa fa-eye"></i> Readability</a> &raquo;</li>
      
    <li>Asking for permission instead of forgiveness</li>
      <li class="wy-breadcrumbs-aside">
        
          <a href="../_sources/readability/asking_for_permission_instead_of_forgiveness_when_working_with_files.rst.txt" rel="nofollow"> View page source</a>
        
      </li>
  </ul>
  <hr/>
</div>

          <div role="main">
            
  <div class="section" id="asking-for-permission-instead-of-forgiveness">
<h1>Asking for permission instead of forgiveness<a class="headerlink" href="#asking-for-permission-instead-of-forgiveness" title="Permalink to this headline">¶</a></h1>
<p>The Python community uses an EAFP (easier to ask for forgiveness than permission) coding style. This coding style assumes that needed variables, files, etc. exist. Any problems are caught as exceptions. This results in a generally clean and concise style containing a lot of <code class="docutils literal notranslate"><span class="pre">try</span></code> and <code class="docutils literal notranslate"><span class="pre">except</span></code> statements.</p>
<div class="section" id="anti-pattern">
<h2>Anti-pattern<a class="headerlink" href="#anti-pattern" title="Permalink to this headline">¶</a></h2>
<p>The code below uses an <code class="docutils literal notranslate"><span class="pre">if</span></code> statement to check if a file exists before attempting to use the file. This is not the preferred coding style in the  Python community. The community prefers to assume that a file exists and you have access to it, and to catch any problems as exceptions.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>

<span class="c1"># violates EAFP coding style</span>
<span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="s2">&quot;file.txt&quot;</span><span class="p">):</span>
    <span class="n">os</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="s2">&quot;file.txt&quot;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="best-practice">
<h2>Best practice<a class="headerlink" href="#best-practice" title="Permalink to this headline">¶</a></h2>
<div class="section" id="assume-the-file-can-be-used-and-catch-problems-as-exceptions">
<h3>Assume the file can be used and catch problems as exceptions<a class="headerlink" href="#assume-the-file-can-be-used-and-catch-problems-as-exceptions" title="Permalink to this headline">¶</a></h3>
<p>The updated code below is a demonstration of the EAFP coding style, which is the preferred style in the Python community. Unlike the original code, the modified code below simply assumes that the needed file exists, and catches any problems as exceptions. For example, if the file does not exist, the problem will be caught as an <code class="docutils literal notranslate"><span class="pre">OSError</span></code> exception.</p>
<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>

<span class="k">try</span><span class="p">:</span>
    <span class="n">os</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="s2">&quot;file.txt&quot;</span><span class="p">)</span>
<span class="c1"># raised when file does not exist</span>
<span class="k">except</span> <span class="ne">OSError</span><span class="p">:</span>
    <span class="k">pass</span>
</pre></div>
</div>
</div>
</div>
<div class="section" id="references">
<h2>References<a class="headerlink" href="#references" title="Permalink to this headline">¶</a></h2>
<ul class="simple">
<li><p><a class="reference external" href="https://docs.python.org/2/glossary.html">Python 2.7.8 - Glossary</a></p></li>
</ul>
</div>
</div>


          </div>
          <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="comparison_to_none.html" class="btn btn-neutral float-right" title="Comparing things to None the wrong way"/>Next <span class="fa fa-arrow-circle-right"></span></a>
      
      
        <a href="index.html" class="btn btn-neutral" title="Readability"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      
    </div>
  

  <hr/>

  <div role="contentinfo">
    <p>
    </p>
  </div>

    <!--End mc_embed_signup-->
  <a href="https://github.com/snide/sphinx_rtd_theme">Sphinx theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a> - Last updated: Sep 29, 2020 
</footer>
        </div>
      </div>

    </section>


  </div>
  


  

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'../',
            VERSION:'',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'.html',
            HAS_SOURCE:  true
        };
    </script>
      <script type="text/javascript" src="../_static/jquery.js"></script>
      <script type="text/javascript" src="../_static/underscore.js"></script>
      <script type="text/javascript" src="../_static/doctools.js"></script>
      <script type="text/javascript" src="../_static/language_data.js"></script>

  

  
  
    <script type="text/javascript" src="../_static/js/theme.js"></script>
  

  
  
  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      });
  </script>
   

  <!-- Place this tag right after the last button or just before your close body tag. -->
  <script async defer id="github-bjs" src="https://buttons.github.io/buttons.js"></script>

</body>
</html>